#!/usr/bin/env python3
# -*- coding:utf-8 -*-

# 高级联系人生成器
# 按照真实的百家姓和正常姓名规则生成联系人信息
# 支持CSV和VCF两种格式

import random
import linecache
import sys
import os

class ContactGenerator:
    def __init__(self):
        # 加载姓氏文件
        self.surnames = self._load_file('res/100.txt')
        
        # 加载适合做名字的汉字 (从现有文件中过滤)
        all_chars = self._load_file('res/8105.txt')
        
        # 常见的用于名字的汉字 (示例列表，实际应用中可以扩展)
        self.first_names = self._filter_valid_name_chars(all_chars)
        
        # 电话前缀列表 (符合中国手机号段规则)
        self.phone_prefixes = ['33', '42', '44', '46', '48', '49', '53', '80', '81', '89',
                               '30', '31', '32', '41', '43', '45', '55', '56', '85', '86',
                               '34', '35', '36', '37', '38', '39', '40', '47', '50', '51',
                               '52', '57', '58', '59', '82', '83', '87', '88']
        
        # 确保资源文件加载成功
        if not self.surnames or not self.first_names:
            print("错误: 无法加载必要的资源文件!")
            sys.exit(1)
    
    def _load_file(self, file_path):
        """加载文件内容，返回行列表"""
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                return [line.strip() for line in f if line.strip()]
        except Exception as e:
            print(f"加载文件 {file_path} 时出错: {e}")
            return []
    
    def _filter_valid_name_chars(self, chars):
        """过滤出适合作为人名的汉字"""
        # 常见的用于名字的汉字列表 (更完整的常用名字库)
        common_name_chars = [
            # 常用单字
            '伟', '芳', '娜', '秀英', '敏', '静', '强', '磊', '军', '洋',
            '勇', '杰', '丽', '涛', '磊', '艳', '辉', '超', '明', '刚',
            '霞', '平', '玲', '桂英', '秀云', '丽娟', '志强', '桂兰',
            '芳', '娜', '敏', '静', '燕', '玲', '秀', '霞', '丽', '娟',
            '洁', '红', '艳', '莉', '兰', '梅', '琴', '丹', '雪', '荣',
            '军', '伟', '勇', '杰', '涛', '磊', '强', '军', '洋', '勇',
            '杰', '涛', '磊', '强', '超', '明', '刚', '辉', '军', '伟',
            
            # 常用双字组合
            '伟强', '俊杰', '晓东', '晓峰', '晓华', '晓明', '晓燕', '晓雨',
            '丽娜', '佳丽', '佳丽', '佳怡', '佳琪', '佳慧', '嘉欣', '嘉怡',
            '子轩', '子涵', '子豪', '子墨', '子睿', '子晨', '子轩', '子涵',
            '雨桐', '雨轩', '雨晨', '雨泽', '雨欣', '雨萌', '雨桐', '雨轩',
            '诗琪', '诗涵', '诗雨', '诗雅', '诗悦', '诗琪', '诗涵', '诗雨'
        ]
        
        # 返回常用名字库，不再从原文件过滤，确保名字更符合实际使用
        return common_name_chars
        
    def generate_random_given_name(self):
        """随机生成一个名字（1-2个字）"""
        # 80%概率为2字名，20%概率为1字名，更符合现实情况
        name_length = 2 if random.random() < 0.8 else 1
        
        if name_length == 1:
            # 单字名：从常用单字中选择
            single_chars = [name for name in self.first_names if len(name) == 1]
            if single_chars:
                return random.choice(single_chars)
            else:
                # 如果没有单字，从双字中取第一个字
                return random.choice(self.first_names)[0]
        else:
            # 双字名：优先使用预定义的双字名
            two_char_names = [name for name in self.first_names if len(name) == 2]
            if two_char_names and random.random() < 0.7:
                # 70%概率使用预定义的双字名
                return random.choice(two_char_names)
            else:
                # 30%概率组合两个单字
                single_chars = [name for name in self.first_names if len(name) == 1]
                if len(single_chars) >= 2:
                    return random.choice(single_chars) + random.choice(single_chars)
                else:
                    # 如果没有足够的单字，使用预定义的双字名
                    return random.choice(self.first_names)
    
    def generate_random_surname(self):
        """随机生成一个姓氏"""
        return random.choice(self.surnames)
    
    def generate_random_given_name(self):
        """随机生成一个名字（1-2个字）"""
        name_length = random.choice([1, 2])  # 70%概率为2字名，30%概率为1字名
        
        if name_length == 1:
            # 单字名
            return random.choice(self.first_names)
        else:
            # 双字名，可以是两个单字的组合，也可以是预定义的双字名
            if random.random() < 0.3 and len(self.first_names) > 1:
                # 30%概率使用预定义的双字名
                two_char_names = [name for name in self.first_names if len(name) == 2]
                if two_char_names:
                    return random.choice(two_char_names)
            # 70%概率组合两个单字
            first_char = random.choice([c for c in self.first_names if len(c) == 1])
            second_char = random.choice([c for c in self.first_names if len(c) == 1])
            return first_char + second_char
    
    def generate_full_name(self):
        """生成完整姓名"""
        surname = self.generate_random_surname()
        given_name = self.generate_random_given_name()
        return surname + given_name
    
    def generate_phone_number(self):
        """生成符合中国手机号段规则的电话号码"""
        # 中国手机号格式：1 + 前缀 + 8位数字
        prefix = random.choice(self.phone_prefixes)
        
        # 生成后8位数字
        suffix1 = random.randint(0, 9999)
        suffix2 = random.randint(0, 9999)
        
        # 格式化为4位数字
        suffix1_str = f"{suffix1:04d}"
        suffix2_str = f"{suffix2:04d}"
        
        # 组合完整手机号
        return f"1{prefix}{suffix1_str}{suffix2_str}"
    
    def generate_csv_contacts(self, num_contacts, output_file):
        """生成CSV格式的联系人信息"""
        print(f"正在生成{num_contacts}个CSV格式的联系人信息...")
        
        with open(output_file, 'w', encoding='utf-8', newline='') as f:
            # 写入标题行
            f.write("Name, Number\n")
            
            # 生成并写入联系人信息
            for i in range(num_contacts):
                name = self.generate_full_name()
                phone = self.generate_phone_number()
                f.write(f"{name}, {phone}\n")
                
                # 显示进度
                if (i + 1) % 100 == 0:
                    print(f"已生成{i + 1}个联系人...")
        
        print(f"\nCSV格式联系人信息已成功生成并保存到: {output_file}")
        self._verify_file(output_file)
    
    def generate_vcf_contacts(self, num_contacts, output_file):
        """生成VCF格式的联系人信息"""
        print(f"正在生成{num_contacts}个VCF格式的联系人信息...")
        
        with open(output_file, 'w', encoding='utf-8', newline='') as f:
            # 生成并写入联系人信息
            for i in range(num_contacts):
                name = self.generate_full_name()
                phone = self.generate_phone_number()
                
                # 格式化VCF条目
                vcf_entry = f"BEGIN:VCARD\n"
                vcf_entry += f"VERSION:2.1\n"
                vcf_entry += f"FN:{name}\n"
                vcf_entry += f"N:{name}\n"
                vcf_entry += f"TEL;CELL:{phone}\n"
                vcf_entry += f"END:VCARD\n\n"
                
                f.write(vcf_entry)
                
                # 显示进度
                if (i + 1) % 100 == 0:
                    print(f"已生成{i + 1}个联系人...")
        
        print(f"\nVCF格式联系人信息已成功生成并保存到: {output_file}")
        
        # 验证文件
        try:
            file_size = os.path.getsize(output_file)
            print(f"文件大小: {file_size} 字节")
            
            # 显示文件的前几行
            print("\n文件的前几行内容:")
            with open(output_file, 'r', encoding='utf-8') as f:
                for i, line in enumerate(f):
                    if i < 10:  # 显示前10行
                        print(f"{line.strip()}")
                    if i > 20:  # 读取过多会很慢
                        break
        except Exception as e:
            print(f"验证文件时出错: {e}")
    
    def _verify_file(self, file_path):
        """验证生成的文件"""
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                lines = f.readlines()
                
                if lines:
                    print(f"文件包含的联系人总数: {len(lines) - 1}个")  # 减1是因为标题行
                    print(f"文件大小: {len(''.join(lines).encode('utf-8'))} 字节")
                    
                    # 显示前5行内容
                    print("\n文件的前5行内容:")
                    for i, line in enumerate(lines[:5]):
                        print(f"第{i+1}行: {line.strip()}")
        except Exception as e:
            print(f"验证文件时出错: {e}")

# 主函数
def main():
    # 显示使用说明
    print("高级联系人生成器 v1.0")
    print("按照真实的百家姓和正常姓名规则生成联系人信息")
    print("支持CSV和VCF两种格式")
    print("\n使用方法:")
    print("  python advanced_contact_generator.py [csv|vcf] [数量] [输出文件名]")
    print("\n参数说明:")
    print("  csv|vcf: 生成的文件类型")
    print("  数量: 要生成的联系人数量")
    print("  输出文件名: 可选，指定输出文件的名称")
    print("\n示例:")
    print("  python advanced_contact_generator.py csv 100")
    print("  python advanced_contact_generator.py vcf 50 contacts.vcf")
    print()
    
    # 检查命令行参数
    if len(sys.argv) < 3:
        print("错误: 参数不足!")
        print("使用方法: python advanced_contact_generator.py [csv|vcf] [数量]")
        sys.exit(1)
    
    # 获取文件类型
    file_type = sys.argv[1].lower()
    if file_type not in ['csv', 'vcf']:
        print("错误: 不支持的文件类型。请使用csv或vcf。")
        sys.exit(1)
    
    # 获取联系人数量
    try:
        num_contacts = int(sys.argv[2])
        if num_contacts <= 0:
            raise ValueError("数量必须大于0")
    except ValueError:
        print("错误: 请提供有效的数字作为联系人数量")
        sys.exit(1)
    
    # 获取输出文件名
    if len(sys.argv) > 3:
        output_file = sys.argv[3]
    else:
        # 使用默认文件名
        output_file = f"contacts_{num_contacts}.{file_type}"
    
    # 创建生成器实例
    generator = ContactGenerator()
    
    # 生成联系人信息
    if file_type == 'csv':
        generator.generate_csv_contacts(num_contacts, output_file)
    else:
        generator.generate_vcf_contacts(num_contacts, output_file)

if __name__ == '__main__':
    main()